package com.bw.widget.navigation

import android.annotation.SuppressLint
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.text.TextUtils
import android.util.AttributeSet
import com.blankj.utilcode.util.ConvertUtils
import com.bw.widget.R
import com.google.android.material.bottomnavigation.BottomNavigationItemView
import com.google.android.material.bottomnavigation.BottomNavigationMenuView
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.bottomnavigation.LabelVisibilityMode

/**
 * 自定义底部导航栏->根据服务器下发得json动态生成底部itemView布局
 * 1.配置底部导航栏图片数据->依托底部导航栏图片显示
 * 2.java中设置大小边距单位->px->utilcode->dp转px->自定义View得兼容适配
 * 3.配置动态布局添加底部item
 * */
class AppBottomView(context: Context, attrs: AttributeSet):
    BottomNavigationView(context, attrs){

    private var sIcons : IntArray

    init {
        //初始化代码块中，初始化图标
        sIcons = intArrayOf(
            R.drawable.icon1275,
            R.drawable.icon64, R.drawable.icon1405
        )
        //初始化tab
        createTabs()
    }

    //初始化tabs方法
    @SuppressLint("RestrictedApi")
    fun createTabs(){
        //获取到maintab实体类
        val mainTabsEntity = UIApplication.tabs
        //获取底部tab选中以及未选中颜色从实体类中获取
        //通过使用Color.parseColor()->解析string类型得标注RGB颜色值得字符串
        val colos = intArrayOf(
            Color.parseColor(mainTabsEntity!!.activeColor),
            Color.parseColor(mainTabsEntity!!.inActiveColor)
        )
        //创建二维选中数组
        val state = arrayOfNulls<IntArray>(2)
        state[0]= intArrayOf(android.R.attr.state_selected)
        state[1]= intArrayOf()
        //设置标签选中setLabelVisibilityMode()
        //LabelVisibilityMode.LABEL_VISIBILITY_AUTO->小于3条item时显示图片文字;
        //大于3条item显示图片不显示文字->选中显示图片文字
        //LabelVisibilityMode.LABEL_VISIBILITY_LABELED->设置按钮得文字图片一直显示
        //LabelVisibilityMode.LABEL_VISIBILITY_SELECTED->只有选中得按钮文本才显示
        //LabelVisibilityMode.LABEL_VISIBILITY_UNLABELED->所有按钮得文本都不显示
        //设置底部item去除默认auto效果->文字图片都显示
        labelVisibilityMode = LabelVisibilityMode.LABEL_VISIBILITY_LABELED
        //配置选中颜色
        val stateList : ColorStateList = ColorStateList(state, colos)
        itemTextColor = stateList
        itemIconTintList = stateList
        //根据mainentity下得tab循环创建tab对象并添加到menu中
        //由于自定义view要进行界面显示处理->读取assets下得json为io流操作
        //json解析->界面绘制速度降低->卡顿以及可能底部自定义view黑屏
        //使用UIApplication.tabs->用户具有点击选中效果->更新选中得数据
        val tabs : ArrayList<MainTabsEntity.Tabs> = UIApplication.tabs!!.tabs!!
        //遍历tab生成tab对象添加到menu中
        for (tab in tabs){
            //如果tab下得enable为false->结束本次循环
            if (!tab.enable){
                //当前模块被关闭跳过本次循环初始化
                continue
            }
            //根据pageurl 获取id
            val menuId = createMenuId(tab.pageUrl!!)
            if (menuId == -1)
                continue
            val menuItem = menu.add(0, menuId, tab.index, tab.title)
            menuItem.setIcon(sIcons[tab.index])
        }
        //循环获取menu图标并设置图标大小
        var index = 0
        for (tab in tabs){
            if (!tab.enable)
                continue
            val menuId = createMenuId(tab.pageUrl!!)
            if (menuId == -1)
                continue
            //图标大小
            val iconSize = ConvertUtils.dp2px(tab.size)
            val menuView = getChildAt(0) as BottomNavigationMenuView
            val itemView = menuView.getChildAt(index) as BottomNavigationItemView
            itemView.setIconSize(iconSize)
            //设置中间+图标默认颜色
            var tintColor : Int = 0
            if (TextUtils.isEmpty(tab.title)){
                tintColor = Color.parseColor("#ff678f")
            }else{
                tintColor = Color.parseColor("#666666")
            }
            itemView.setIconTintList(ColorStateList.valueOf(tintColor))
            //禁止掉点按时 上下浮动的效果
            itemView.setShifting(false)
            //禁止图标浮动
            index ++
        }
        //处理底部选中
        if (UIApplication!!.tabs!!.selectTab >= 0){
            if (UIApplication!!.tabs!!.tabs!![UIApplication.tabs!!.selectTab].enable){
                val pageUrl = UIApplication.tabs!!.tabs!![UIApplication.tabs!!.selectTab]
                        .pageUrl
                val itemId = createMenuId(pageUrl!!)
                //这里需要延迟一下 再定位到默认选中的tab
                //因为 咱们需要等待内容区域,也就NavGraphBuilder解析数据并初始化完成，
                //否则会出现 底部按钮切换过去了，但内容区域还没切换过去
                //刷新UI得常见方法->Runnable->Handler->进行线程切换
                //刷新对应UI上属性以及样式
                post { selectedItemId = itemId }
            }
        }
    }

    //根据传递进来得pageUrl获取distination下得fragmentid
    //通过id绑定menu下得item与fragment得绑定从而实现
    //点击那个item显示对应得fragment
    fun createMenuId(pageUrl: String):Int{
        if (TextUtils.isEmpty(pageUrl))
            return -1
        var id = 0
        id = UIApplication.destinationes!!.get(pageUrl)!!.id
        return id
    }

}